/**
 * Copyright 1996 self.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 *
 * @author Ashin Wimalajeewa
 *
 * Note, this is a very old runtime library that I have evolved since 1996. I rarely use it
 * now because the Apache Commons project has made it obsolete.
 */
package self.oss.svn.client;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class UpdateOverlay {
	final static public String SVN_STATUS_CMD = "svn status";
	final static public String SVN_ADD_CMD = "svn add ";
	final static public String SVN_REMOVE_CMD = "svn del --force ";
	
	private List entries = new ArrayList();
	private List conflictedEntries = new ArrayList();
	
	static public void main(String[] args) throws Exception {
		UpdateOverlay util = new UpdateOverlay();
		util.run();
	}
	
	public void run() throws Exception {
		loadStatus();
		refreshWorkingCopy();
		dumpEntries("Conflicted entries", conflictedEntries);
	}
	
	public void loadStatus() throws IOException {
		System.out.println("loading working copy status...");
		Process statusProc = Runtime.getRuntime().exec(SVN_STATUS_CMD);
		DataInputStream is = new DataInputStream(statusProc.getInputStream());
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		String line;
		try {
			while ((line = br.readLine()) != null) {
				StatusEntry entry = parseStatusLine(line);
				entries.add(entry);
			}
		} finally {
			br.close();
		}
	}
	
	public void refreshWorkingCopy() throws Exception {
		System.out.println("refreshing working copy...");
		for (Iterator iter = entries.iterator(); iter.hasNext();) {
			StatusEntry element = (StatusEntry) iter.next();
			switch (element.action) {
			case '?':
				runSvnWcCmdOnResource(SVN_ADD_CMD, element.resource);
				break;
			case '!':
				runSvnWcCmdOnResource(SVN_REMOVE_CMD, element.resource);
				break;
			case '~':
			case 'C':
				conflictedEntries.add(element);
				break;
			default:	// 'A', 'D', ' ', 'G', 'I', 'M', 'R', 'x' 
				break;
			}
		}
	}
	
	private void runSvnWcCmdOnResource(String cmd, String resource) throws Exception {
		String fullCmd = cmd + resource;
		System.out.println(fullCmd);
		Process p = Runtime.getRuntime().exec(fullCmd);
		p.waitFor();
	}
	
	private void dumpEntries(String header, List toIterateOver) {
		if (toIterateOver.isEmpty())
			return;
		System.out.print(header);
		for (Iterator iter = toIterateOver.iterator(); iter.hasNext();) {
			StatusEntry element = (StatusEntry) iter.next();
			System.out.println(element.action + "\t" + element.resource);
		}
	}
	
	private StatusEntry parseStatusLine(String line) {
		char action = line.charAt(0);
		String resource = line.substring(7);
		return new StatusEntry(action, resource);
	}
	
	private class StatusEntry {
		final public char 	action;
		final public String resource;
		
		public StatusEntry(char act, String res) {
			action = act;
			resource = res;
		}
	}
}
